"""
  下载器，用于下载目标网页的内容
  create by 01 on 2020-02-29
"""
__author__ = '01'

import gzip
import ssl
from io import BytesIO
from urllib import request
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

import config


class HtmlDownloader(object):

    @staticmethod
    def use_phantomjs(url):
        """
        使用PhantomJS下载url地址的页面内容
        用于目标页面内容是通过js动态加载的情况
        :param url: 需要下载的url
        :return: 返回None或者页面内容
        """
        browser = webdriver.PhantomJS(config.PHANTOMJS)
        browser.get(url)
        content = browser.page_source

        return content

    @staticmethod
    def use_chrome(url):
        """
        使用chrome下载url地址的页面内容
        用于目标页面内容是通过js动态加载的情况
        :param url: 需要下载的url
        :return: 返回None或者页面内容
        """
        # 设置chrome在后台静默运行
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')

        browser = webdriver.Chrome(config.CHROME_DRIVER, chrome_options=chrome_options)
        browser.get(url)
        content = browser.page_source

        return content

    @staticmethod
    def use_urllib(url):
        """
        下载url地址的页面内容
        :param url: 需要下载的url
        :return: 返回None或者页面内容
        """
        if url is None:
            return None

        # 全局取消证书验证
        ssl._create_default_https_context = ssl._create_unverified_context
        response = request.urlopen(url)
        if response.getcode() != 200:
            return None

        htmls = response.read()
        # 解压gzip压缩过的数据
        buff = BytesIO(htmls)
        f = gzip.GzipFile(fileobj=buff)
        content = f.read()
        print(content.decode('utf-8'))

        return content
